package cn.itcast.service;

import cn.itcast.dao.CheckGroupMapper;
import cn.itcast.domain.CheckGroup;
import cn.itcast.entity.PageResult;
import cn.itcast.entity.QueryPageBean;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = CheckGroupService.class)
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {

    @Autowired
    private CheckGroupMapper checkGroupMapper;

    /**
     * 添加检查组信息
     *
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    public void insertCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {

        checkGroupMapper.insertCheckGroup(checkGroup);
        Integer checkGroupId = checkGroup.getId();
        this.insertCheckItemOfCheckGroup(checkGroupId, checkItemIds);

    }

    /**
     * 分页查询
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult findByPage(QueryPageBean queryPageBean) {
        //健壮性判断
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        if (currentPage == null) {
            currentPage = 1;
        }
        if (pageSize == null) {
            pageSize = 10;
        }
        //分页助手
        PageHelper.startPage(currentPage, pageSize);

        List<CheckGroup> byPage = checkGroupMapper.findByPage(queryPageBean.getQueryString());

        /*//查询每个检查组对应的检查项
        for (CheckGroup checkGroup : byPage) {
            //获取检查组的id
            Integer checkGroupId = checkGroup.getId();
            //根据中间表 查询所有的checkItemId
            List<Integer> checkItems = checkGroupMapper.findByCheckItemId(checkGroupId);
            //根据CheckItemId 查询所有的checkItem
            List<CheckItem> list1 = checkGroupMapper.selectCheckIems(checkItems);
             //把所有的checkItem封装进checkGroup
            checkGroup.setCheckItems(list1);
        }*/
        Page<CheckGroup> page = (Page<CheckGroup>) byPage;

        long total = page.getTotal();
        List<CheckGroup> result = page.getResult();
        return new PageResult(total, result);
    }


    /**
     * 删除检查组信息
     *
     * @param id
     */
    @Override
    public void deleteCheckGroup(Integer id) {
        checkGroupMapper.deleteCheckGroupId(id);

        checkGroupMapper.deleteCheckGroup(id);
    }

    /**
     * 查询检查组对象,回显其信息
     *
     * @param id
     * @return
     */
    @Override
    public CheckGroup findByCheckGroupId(Integer id) {
        return checkGroupMapper.findByCheckGroupId(id);
    }

    /**
     * 查询检查组对应的检查项的ids
     *
     * @param id
     * @return
     */
    @Override
    public List<Integer> findByCheckItemOfCheckGroup(Integer id) {
        List<Integer> ids = checkGroupMapper.findByCheckItemOfCheckGroup(id);
        return ids;
    }

    /**
     * 修改检查组
     *
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    public void updateCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {


        Integer checkGroupId = checkGroup.getId();
        //第一步删除中间的关联关系
        checkGroupMapper.deleteCheckGroupId(checkGroupId);
        //修改,分两步,两张表
        //第二步修改检查组的信息
        checkGroupMapper.updateCheckGroup(checkGroup);
        //第三步重新建立联系(直接调用本类中的方法 : 简化重复代码的编写)
        this.insertCheckItemOfCheckGroup(checkGroupId, checkItemIds);

    }


    /**
     * 查询所有的检查组
     *
     * @return
     */
    @Override
    public List<CheckGroup> findAllCheckGroup() {
        return checkGroupMapper.findAllCheckGroup();
    }

    /**
     * 批量删除
     *
     * @param params
     */
    @Override
    public void deleteMoreCheckGroup(Integer[] params) {

        //批量删除
        List<Integer> list = new ArrayList<>();
        if (params != null) {
            for (Integer integer : params) {
                list.add(integer);
            }
        }
        //先删除中间的关联关系
        checkGroupMapper.deleteCheckGroupAndCheckItemId(list);
        //在删除检查组的关联关系
        checkGroupMapper.deleteMoreCheckGroup(list);
    }

    /**
     * 抽取方法:建立检查组和检查项的关联关系
     * 使用sql语句调优,批量新增
     *
     * @param checkGroupId
     * @param checkItemIds
     */
    public void insertCheckItemOfCheckGroup(Integer checkGroupId, Integer[] checkItemIds) {
        List<Map<String, Object>> list = new ArrayList();
        if (checkItemIds != null && checkItemIds.length > 0) {
            for (Integer checkItemId : checkItemIds) {
                Map<String, Object> map = new HashMap<>();
                map.put("checkGroupId", checkGroupId);
                map.put("checkItemId", checkItemId);
                list.add(map);
            }
            //只有当checkItemIds不为空时,才会执行这个方法
            checkGroupMapper.insertCheckItemOfCheckGroup(list);
        }


    }
}
